import json
import logging

from funcall.FuncallInfo import funcall_info_to_mysql, FuncallInfo
from utils.log_utils import log_title

FUN_CALL_REMARK = f"调用方法的理由,要达到什么结果,简短的说明"


funcall_log=logging.getLogger("funcall")
class AbstractFunCall:
    """
    json格式如下

        {
            "type": "function",
            "function": {
                "name": "get_current_weather",
                "description": "当你想查询指定城市的天气时非常有用。",
                "parameters": {
                    "type": "object",
                    "properties": {
                        # 查询天气时需要提供位置，因此参数设置为location
                        "location": {
                            "type": "string",
                            "description": "城市或县区，比如北京市、杭州市、余杭区等。"
                        }
                    }
                },
                "required": [
                    "location"
                ]
            }
        }
    """

    def __init__(self):
        self.name = "abstract_fun_call"
        self.description="函数描述"
        self.parameters={}

    def to_json(self):
        return json.dumps(self.__dict__,ensure_ascii=False)

    #调用该方法,需要传入json对象或者json格式的字符串
    def call(self, args):
        if isinstance(args, str):
            jsonRoot=json.loads(args)
        else:
            jsonRoot=args
        # print(f"jsonRoot={jsonRoot}\n")
        return self.action(jsonRoot=jsonRoot)

    #该方法用于继承该类的方法实现类修改
    def action(self, jsonRoot):
        # print("jsonRoot="+jsonRoot)
        raise Exception("call函数需要重写")
    def debug(self,msg, *args, **kwargs):
        funcall_log.debug(msg, *args, **kwargs)

def fun_call_log_debug(msg:FuncallInfo):
    description = msg.description
    args = msg.req_args
    funcall_info_to_mysql(msg)
    funcall_log.debug(f"""\n{log_title(description)}\n{args}""")


def funcallResultMsgBySubprocessResult(_result):
    # print(_result)
    output = _result.stdout
    if _result.stderr != None and _result.stderr != '':
        output = _result.stderr if _result.stdout == '' else _result.stdout + "\n" + _result.stderr;
    return output

